﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RRHH.Competencias.Controladores;
using RRHH.Competencias.Entities;

namespace WebSite
{
    public partial class ColaboradorCapacidades : System.Web.UI.Page
    {
        protected string codigoPantalla = "COLABORADORCAPACIDADES";

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (!Master.ValidarAcceso(codigoPantalla)) Response.Redirect("Inicio.aspx");

                Session["ColaboradorCapacidades.GrdColaboradores.PageIndex"] = 0;
                Session["ColaboradorCapacidades.LstColaboradores"] = null;

                Session["ColaboradorCapacidades.LstCapacidadesAsignadas"] = null;
                Session["ColaboradorCapacidades.LstCapacidadesDisponibles"] = null;

                Session["ColaboradorCapacidades.GrdCapacidadesDisponibles.PageIndex"] = 0;
                Session["ColaboradorCapacidades.GrdCapacidadesAsignadas.PageIndex"] = 0;

                updDetalleColaborador_ModalPopupExtender.Hide();

                try
                {
                    this.BuscarDatos(null, null, null, null, null, null, null, null, chkActivo.Checked);
                    this.CargarComboSectores();
                }
                catch (Exception ex)
                {
                    this.RegistrarMensajeJavascript("Error", "No se pudo obtener el listado de Colaboradores. " + ex.Message);
                }
            }
        }

        private void BuscarDatos(long? colaborador_id, string legajo, string nombre, string apellido,
                                 string domicilio, string mail, string telefono, string telefonoMovil,
                                 bool activo)
        {

            if (legajo == string.Empty)
            {
                legajo = null;
            }

            if (apellido == string.Empty)
            {
                apellido = null;
            }


            GestorColaborador gestorColaborador = new GestorColaborador();
            List<Colaborador> lstColaboradores = new List<Colaborador>();

            try
            {
                lstColaboradores = gestorColaborador.Buscar(colaborador_id, legajo, nombre, apellido, domicilio,
                                                        mail, telefono, telefonoMovil, activo);

                GrdColaboradores.DataKeyNames = new string[] { "Legajo", "IdColaborador","Nombre","Apellido","SectorId" };

                GrdColaboradores.DataSource = lstColaboradores;
                GrdColaboradores.PageIndex = (int)Session["ColaboradorCapacidades.GrdColaboradores.PageIndex"];
                GrdColaboradores.DataBind();

                UpdListadoColaboradores.Update();

                Session["ColaboradorCapacidades.LstColaboradores"] = lstColaboradores;


            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript("Error", "No se pudo obtener el listado de Colaboradores");
            }

        }

        private void RegistrarMensajeJavascript(string nombre, string mensaje)
        {
            mensaje = mensaje.Replace("'", string.Empty);
            mensaje = mensaje.Replace("(", string.Empty);
            mensaje = mensaje.Replace(")", string.Empty);
            mensaje = mensaje.Replace(",", string.Empty);
            mensaje = mensaje.Replace(";", string.Empty);
            mensaje = mensaje.Replace("\"", string.Empty);

            ScriptManager.RegisterStartupScript(this, this.GetType(), nombre, "alert('" + mensaje + "');", true);
        }

        protected void cmdBuscar_Click(object sender, ImageClickEventArgs e)
        {
            Session["ColaboradorCapacidades.GrdColaboradores.PageIndex"] = 0;
            this.BuscarDatos(null, txtLegajoBuscar.Text, null, txtApellidoBuscar.Text, null, null, null, null, true);
        }

        protected void GrdColaboradores_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {

        }

        protected void GrdColaboradores_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            int indiceFila = 0;

            if (e.CommandName == "Asignar")
            {

                try
                {
                    List<Colaborador> lstColaborador = new List<Colaborador>();
                    lstColaborador = (List<Colaborador>)Session["ColaboradorCapacidades.LstColaboradores"];
                    Colaborador colaboradorUpdate = new Colaborador();

                    indiceFila = Convert.ToInt16( e.CommandArgument );
                    Int64 idColaborador = Convert.ToInt64( GrdColaboradores.DataKeys[indiceFila].Values["IdColaborador"] );

                    foreach (Colaborador colaborador in lstColaborador)
                    {
                        if (colaborador.IdColaborador == idColaborador)
                        {
                            colaboradorUpdate = colaborador;
                            Session["ColaboradorCapacidades.ColaboradorUpdate"] = colaboradorUpdate;
                            break;
                        }
                    }

                    EstadoInterfaz( "Edicion" );
                    CompletarCampos( colaboradorUpdate );
                    Session["GrdCapacidadesDisponibles.Indice"] = 0;

                    BuscarCapacidadesColaboradorSeleccionado( colaboradorUpdate );
                    BuscarCapacidadesDisponibles( txtBuscarCapacidad.Text );

                    this.updDetalleColaborador_ModalPopupExtender.Show();
                    this.updDetalleColaborador.Update();

                }
                catch (Exception ex)
                {
                    this.RegistrarMensajeJavascript("Error","No se pudo completar la información del Colaborador. " + ex.Message);
                }
            }
        }

        protected void EstadoInterfaz ( string estado )
        {
            switch (estado)
            {
                case "Busqueda":
                    break;

                case "Edicion":
                    this.updDetalleColaborador_ModalPopupExtender.Show();
                    break;
            }
        }

        protected void CompletarCampos ( Colaborador colaborador )
        {
            txtLegajo.Text = colaborador.Legajo;
            txtApellido.Text = colaborador.Apellido;
            txtNombres.Text = colaborador.Nombre;
            ddlSector.SelectedValue = colaborador.Sector.Id.ToString();
        }

        private void CargarComboSectores()
        {
            GestorSector gestorSector = new GestorSector();

            try
            {
                List<Sector> lstSectores = new List<Sector>();
                Sector sector = new Sector();

                lstSectores = gestorSector.BuscarTodos(true);

                sector.Id = -1;
                sector.Nombre = "Selecione un sector";
                lstSectores.Insert(0, sector);

                ddlSector.DataSource = lstSectores;
                ddlSector.DataTextField = "Nombre";
                ddlSector.DataValueField = "Id";
                ddlSector.DataBind();
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript("Error", "No se pudieron obtener los sectores");
            }
        }

        protected void GrdCapacidadesDisponibles_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int indiceFila = 0;

            if (e.CommandName == "Agregar")
            {
                try
                {
                    Capacidad capacidadBorrar = new Capacidad();
                    List<Capacidad> lstCapacidadesDisponibles = (List<Capacidad>)Session["ColaboradorCapacidades.LstCapacidadesDisponibles"];
                    List<Capacidad> lstCapacidadesAsignadas = (List<Capacidad>)Session["ColaboradorCapacidades.LstCapacidadesAsignadas"];

                    indiceFila = Convert.ToInt32( e.CommandArgument );
                    long idCapacidad = long.Parse( GrdCapacidadesDisponibles.DataKeys[indiceFila].Values["Id"].ToString() );

                    foreach (Capacidad capacidad in lstCapacidadesDisponibles)
                    {
                        if (capacidad.Id == idCapacidad)
                        {
                            if (lstCapacidadesAsignadas == null) lstCapacidadesAsignadas = new List<Capacidad>();


                            if (!lstCapacidadesAsignadas.Contains( capacidad ))
                            {

                                capacidad.Nivel = new NivelCapacidad( 1, string.Empty, string.Empty ); //por defecto el nivel 1:
                                lstCapacidadesAsignadas.Add( capacidad );
                                capacidadBorrar = capacidad;
                            }
                        }
                    }

                    GrdCapacidadesAsignadas.DataSource = lstCapacidadesAsignadas;
                    GrdCapacidadesAsignadas.PageIndex = GrdCapacidadesAsignadas.PageCount;
                    GrdCapacidadesAsignadas.DataKeyNames = new string[] { "Id" };
                    GrdCapacidadesAsignadas.DataBind();

                    Session["ColaboradorCapacidades.LstCapacidadesAsignadas"] = lstCapacidadesAsignadas;
                    Session["ColaboradorCapacidades.LstCapacidadesDisponibles"] = lstCapacidadesDisponibles;

                    lblCantCapacAsignadas.Text = lstCapacidadesAsignadas.Count.ToString();
                }
                catch (Exception)
                {
                    this.RegistrarMensajeJavascript("Error","No se pudo asignar la Capacidad");
                }
            }
        }

        protected void BuscarCapacidadesDisponibles ( string nombre )
        {
            try
            {
                if (Session["ColaboradorCapacidades.GrdCapacidadesDisponibles.PageIndex"] == null)
                {
                    Session["ColaboradorCapacidades.GrdCapacidadesDisponibles.PageIndex"] = 0;
                }

                GestorCapacidad gestorCapacidad = new GestorCapacidad();
                List<Capacidad> lstCapacidades = new List<Capacidad>();

                lstCapacidades = gestorCapacidad.Buscar( null, nombre, null, null, true );

                GrdCapacidadesDisponibles.DataKeyNames = new string[] { "Id" };

                GrdCapacidadesDisponibles.DataSource = lstCapacidades;
                GrdCapacidadesDisponibles.PageIndex = Convert.ToInt32( Session["ColaboradorCapacidades.GrdCapacidadesDisponibles.PageIndex"] );
                GrdCapacidadesDisponibles.DataBind();

                Session["ColaboradorCapacidades.LstCapacidadesDisponibles"] = lstCapacidades;

                lblCantCapacDisponibles.Text = lstCapacidades.Count.ToString();
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript("Error", "No se pudo cargar el listado de Capacidades." + ex.Message);
            }
        }

        protected void BuscarCapacidadesColaboradorSeleccionado ( Colaborador colaborador )
        {
            //GrdCapacidadesAsignadas.DataSource = null;
            //GrdCapacidadesAsignadas.DataBind();
            //colaborador.CapacidadesActuales.Clear();

            try
            {
                if (Session["ColaboradorCapacidades.GrdCapacidadesAsignadas.PageIndex"] == null)
                {
                    Session["ColaboradorCapacidades.GrdCapacidadesAsignadas.PageIndex"] = 0;
                }

                GestorColaborador gestorColaborador = new GestorColaborador();
                gestorColaborador.ObtenerCapacidadesColaborador( colaborador );

                GrdCapacidadesAsignadas.DataKeyNames = new string[] { "Id" };

                GrdCapacidadesAsignadas.DataSource = colaborador.CapacidadesActuales;
                GrdCapacidadesAsignadas.PageIndex = Convert.ToInt32( Session["ColaboradorCapacidades.GrdCapacidadesAsignadas.PageIndex"] );
                GrdCapacidadesAsignadas.DataBind();

                Session["ColaboradorCapacidades.LstCapacidadesAsignadas"] = colaborador.CapacidadesActuales;

                lblCantCapacAsignadas.Text = colaborador.CapacidadesActuales.Count.ToString();

            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript("Error", "No se pudo carga el listado de Capacidades Asignadas. " + ex.Message);
            }
        }

        protected void GrdCapacidadesDisponibles_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {

        }

        protected void GrdCapacidadesAsignadas_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            if (Session["ColaboradorCapacidades.LstCapacidadesAsignadas"] == null) return;

            GrdCapacidadesAsignadas.DataSource = (List<Capacidad>)Session["ColaboradorCapacidades.LstCapacidadesAsignadas"];
            GrdCapacidadesAsignadas.PageIndex = e.NewPageIndex;
            GrdCapacidadesAsignadas.DataBind();
        }

        protected void GrdCapacidadesAsignadas_RowCancelingEdit ( object sender, GridViewCancelEditEventArgs e )
        {
            GrdCapacidadesAsignadas.EditIndex = -1;
            GrdCapacidadesAsignadas.DataSource = (List<Capacidad>)Session["ColaboradorCapacidades.LstCapacidadesAsignadas"];            
            GrdCapacidadesAsignadas.DataBind();
        }

        protected void GrdCapacidadesAsignadas_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int indiceFila = 0;

            if (e.CommandName.Equals( "Quitar" ))
            {
                indiceFila = Convert.ToInt32( e.CommandArgument );

                Capacidad capacidadBorrar = new Capacidad();

                List<Capacidad> lstCapacidadesDisponibles = (List<Capacidad>)Session["ColaboradorCapacidades.LstCapacidadesDisponibles"];
                List<Capacidad> lstCapacidadesAsignadas = (List<Capacidad>)Session["ColaboradorCapacidades.LstCapacidadesAsignadas"];

                long idCapacidad = long.Parse( GrdCapacidadesAsignadas.DataKeys[indiceFila].Values["Id"].ToString() );

                foreach (Capacidad capacidad in lstCapacidadesAsignadas)
                {
                    if (capacidad.Id == idCapacidad)
                    {
                        capacidadBorrar = capacidad;
                    }
                }

                if (lstCapacidadesDisponibles.Contains( capacidadBorrar ))
                {
                    lstCapacidadesAsignadas.Remove( capacidadBorrar );
                }

                GrdCapacidadesAsignadas.DataSource = lstCapacidadesAsignadas;
                GrdCapacidadesAsignadas.DataBind();

                Session["ColaboradorCapacidades.LstCapacidadesAsignadas"] = lstCapacidadesAsignadas;
                Session["ColaboradorCapacidades.LstCapacidadesDisponibles"] = lstCapacidadesDisponibles;

                lblCantCapacAsignadas.Text = lstCapacidadesAsignadas.Count.ToString();
            }

        }

        protected void GrdCapacidadesAsignadas_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            Capacidad capacidad = (Capacidad)e.Row.DataItem;

            try
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    GestorEnumerador<NivelCapacidad> gestorNivel = new GestorEnumerador<NivelCapacidad>();
                    List<NivelCapacidad> lstNivelCapacidad = gestorNivel.Enumeracion;

                    if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                    {
                        DropDownList ddlNivel = (DropDownList)e.Row.FindControl( "DdlNivel" );
                        ddlNivel.DataSource = lstNivelCapacidad;
                        ddlNivel.DataTextField = "Nombre";
                        ddlNivel.DataValueField = "Id";
                        ddlNivel.DataBind();

                        ddlNivel.SelectedValue = capacidad.Nivel.Id.ToString();
                    }
                }
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript("Error","No se pudo desasignar de la lista");
            }
        }

        protected void GrdCapacidadesAsignadas_RowEditing ( object sender, GridViewEditEventArgs e )
        {
            GrdCapacidadesAsignadas.EditIndex = e.NewEditIndex;

            Colaborador colaborador = (Colaborador)Session["ColaboradorCapacidades.ColaboradorUpdate"];
            GrdCapacidadesAsignadas.DataSource = colaborador.CapacidadesActuales;            
            GrdCapacidadesAsignadas.DataBind();
        }

        protected void GrdCapacidadesAsignadas_RowUpdating ( object sender, GridViewUpdateEventArgs e )
        {
            long capacidadIdActual = Convert.ToInt64( GrdCapacidadesAsignadas.DataKeys[e.RowIndex].Values["Id"] );
            DropDownList DdlNivel = (DropDownList)GrdCapacidadesAsignadas.Rows[e.RowIndex].FindControl( "DdlNivel" );

            Colaborador colaborador = (Colaborador)Session["ColaboradorCapacidades.ColaboradorUpdate"];

            List<Capacidad> capacidades = colaborador.CapacidadesActuales;

            Capacidad capacidad = null;

            foreach (Capacidad item in colaborador.CapacidadesActuales)
            {
                if (item.Id == capacidadIdActual)
                {
                    capacidad = item;
                    break;
                }
            }

            if (capacidad == null) capacidad = new Capacidad();

            if (!string.IsNullOrEmpty( DdlNivel.SelectedValue ))
                capacidad.Nivel = new NivelCapacidad( Convert.ToInt64( DdlNivel.SelectedValue ), DdlNivel.SelectedItem.ToString(), string.Empty );

            Session["ColaboradorCapacidades.ColaboradorUpdate"] = colaborador;
            GrdCapacidadesAsignadas.EditIndex = -1;

            colaborador = (Colaborador)Session["ColaboradorCapacidades.ColaboradorUpdate"];

            GrdCapacidadesAsignadas.DataSource = colaborador.CapacidadesActuales;            
            GrdCapacidadesAsignadas.DataBind();
        }

        protected void cmdBuscarCapacidad_Click ( object sender, ImageClickEventArgs e )
        {

        }

        
        protected void cmdCancelar_Click ( object sender, ImageClickEventArgs e )
        {
            this.updDetalleColaborador_ModalPopupExtender.Hide();
            Session["ColaboradorCapacidades.ColaboradorUpdate"] = null;
            this.UpdListadoColaboradores.Update();
        }

        protected void cmdAceptar_Click ( object sender, ImageClickEventArgs e )
        {
            GestorColaborador gestorColaborador = new GestorColaborador();
            Colaborador colaborador = new Colaborador();
            Colaborador colaboradorAnterior = null;

            try
            {
                colaborador.CapacidadesActuales.AddRange( (List<Capacidad>)Session["ColaboradorCapacidades.LstCapacidadesAsignadas"] );

                if (colaborador.CapacidadesActuales.Count == 0)
                {
                    this.RegistrarMensajeJavascript("Aviso","El colaborador debe poseer al menos una capacidad");
                    return;
                }

                if (Session["ColaboradorCapacidades.ColaboradorUpdate"] != null)
                {
                    colaboradorAnterior = new Colaborador();
                    colaboradorAnterior = (Colaborador)Session["ColaboradorCapacidades.ColaboradorUpdate"];
                    colaborador.IdColaborador = colaboradorAnterior.IdColaborador;

                    gestorColaborador.Modificar( colaborador );

                    Session["ColaboradorCapacidades.ColaboradorUpdate"] = colaborador;
                    this.RegistrarMensajeJavascript("Aviso","La operación se registró corerctamente");
                    
                }

                updDetalleColaborador_ModalPopupExtender.Hide();
                Session["ColaboradorCapacidades.ColaboradorUpdate"] = null;
                this.BuscarDatos( null, null, null, null, null, null, null, null, chkActivo.Checked );

            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript("Error","No se pudo registrar la operación");
            }
        }

        

    }
}